package com.code.service.impl;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
import org.springframework.amqp.core.Message;


@Service
public class RabbitMQServiceImpl {

    /**
     * 消费消息，这里为了方便就只消费一个队列
     */
    @RabbitListener(queues = {"msgopenid_bzdata_relation"})
    public void testMessage2(String msg, Channel channel, Message message) throws Exception{
        try {

            //TODO 具体业务
            System.out.println("消息（msg变量名无需和发送消息的变量名一致）："+ msg);

            /*
                确认消费消息，确认后消息将从队列中删除
                第一个参数：表示消息投递序号，每次消费消息或者消息重新投递后，deliveryTag都会增加。
                第二个参数：为true表示将批量处理小于deliveryTag这个序号的所有消息。
            */
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

        }  catch (Exception e) {

            if (message.getMessageProperties().getRedelivered()) {
                /*
                 * 与basicNack区别在于不能进行批量操作，其他用法很相似。
                 * 参数1：投递序号
                 * 参数2：是否重新加入队列
                 */
                channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
            } else {
                /*
                   表示失败确认，一般在消费消息业务异常时用到此方法，可以将消息重新投递入队列。
                   参数1：投递序号
                   参数2：是否批量处理比这个投递序号小的所有消息
                   参数3：是否重新放入队列
                */
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
            }
        }
    }
}

